import { ref, unref, nextTick, watch } from 'vue'

export function useRowSelection(propsRef, tableElRef, emit, setCustData) {
  const selectedRowRef = ref([])
  const selectedAllRowRef = ref([]) // 所有的包含跨页数据

  function clearSelectedRowKeys() {
    selectedAllRowRef.value = []
    selectedRowRef.value = []
  }

  function getRowSelection(val) {
    // const { rowSelection, rowKey, clickToRowSelect } = unref(propsRef);
    // if (!rowSelection || !clickToRowSelect) return;
    // const keys = getSelectRowKeys();
    // const key = getKey(record, rowKey, unref(getAutoCreateKey));
    // if (!key) return;

    // const isCheckbox = rowSelection.type === 'checkbox';
    // if (isCheckbox) {
    //   // 找到tr
    //   const tr: HTMLElement = (e as MouseEvent).composedPath?.().find((dom: HTMLElement) => dom.tagName === 'TR') as HTMLElement;
    //   if (!tr) return;
    //   // 找到Checkbox，检查是否为disabled
    //   const checkBox = tr.querySelector('input[type=checkbox]');
    //   if (!checkBox || checkBox.hasAttribute('disabled')) return;
    //   if (!keys.includes(key)) {
    //     setSelectedRowKeys([...keys, key]);
    //     return;
    //   }
    //   const keyIndex = keys.findIndex((item) => item === key);
    //   keys.splice(keyIndex, 1);
    //   setSelectedRowKeys(keys);
    //   return;
    // }

    // const isRadio = rowSelection.type === 'radio';
    // if (isRadio) {
    //   if (!keys.includes(key)) {
    //     if (keys.length) {
    //       clearSelectedRowKeys();
    //     }
    //     setSelectedRowKeys([key]);
    //     return;
    //   }
    //   clearSelectedRowKeys();
    // }
    // 暂支持（表格多选）
    const { selection } = unref(propsRef)
    if (!selection) {
      return null
    }
    selectedRowRef.value = val
    getCacheRowkeys()
    setCustData(selectedAllRowRef.value) // 把全选数据 同步到 行点击js中useCustomRow
    emit('selection-change', selectedAllRowRef.value, tableElRef)
  }

  // 记忆选择核心方法
  function getCacheRowkeys() {
    // 标识当前行的唯一键的名称
    let idKey = propsRef.value.rowKey
    // 如果总记忆中还没有选择的数据，那么就直接取当前页选中的数据，不需要后面一系列计算
    if (selectedAllRowRef.value.length <= 0) {
      selectedAllRowRef.value = selectedRowRef.value
      return
    }
    // 总选择里面的key集合
    let selectAllIds = []
    selectedAllRowRef.value.forEach((row) => {
      selectAllIds.push(row[idKey])
    })
    let selectIds = []
    // 获取当前页选中的id
    selectedRowRef.value.forEach((row) => {
      selectIds.push(row[idKey])
      // 如果总选择里面不包含当前页选中的数据，那么就加入到总选择集合里
      if (selectAllIds.indexOf(row[idKey]) < 0) {
        selectedAllRowRef.value.push(row)
      }
    })
    let noSelectIds = []
    let tableData = unref(propsRef.value.data)
    // 得到当前页没有选中的id
    tableData.forEach((row) => {
      if (selectIds.indexOf(row[idKey]) < 0) {
        noSelectIds.push(row[idKey])
      }
    })
    noSelectIds.forEach((id) => {
      if (selectAllIds.indexOf(id) >= 0) {
        for (let i = 0; i < selectedAllRowRef.value.length; i++) {
          if (selectedAllRowRef.value[i][idKey] == id) {
            // 如果总选择中有未被选中的，那么就删除这条
            selectedAllRowRef.value.splice(i, 1)
            break
          }
        }
      }
    })
  }

  // 监听多选数据的变化
  watch(
    selectedAllRowRef,
    (val) => {
      nextTick(() => {
        selectedAllRowRef.value = unref(val)

        emit('selection-change', selectedAllRowRef.value, tableElRef)
      })
    },
    {
      immediate: true,
      deep: true
    }
  )
  return {
    selectedAllRowRef,
    getRowSelection,
    getCacheRowkeys,
    clearSelectedRowKeys
  }
}
